-
Notifications
You must be signed in to change notification settings - Fork 3
feat: enhance TypedEncoder with additional encoding types #47
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
- Moved src/libs/TypedEncoder.sol to src/lib/TypedEncoder.sol - Updated import paths in test files - Removed empty src/libs/ directory - All tests passing (28/28)
* feat: add polymorphic support * address PR comment
Update import from src/libs/ to src/lib/ to match new TypedEncoder location
- Remove asBytes parameter from _encodeAbi and _encodeChunkFields - Add _hasDynamicFields helper to distinguish encoding type from field contents - Simplify _encodeAsArray to enforce single chunk and encode structs normally - Fix ABI encoding type to properly wrap as bytes fields in parent structs - Add offset wrapper for dynamic ABI structs, skip for static Tests: - Add TypedEncoderErrors.t.sol with 10 error validation tests - Add TypedEncoderNested.t.sol with 10 complex nesting tests - Refactor TypedEncoderPolymorphic.t.sol to use CallWithSignature properly - Update TypedEncoderCalldata.t.sol expectations for ABI encoding as bytes - Fix EIP-712 typeHash alphabetical ordering - All 68 tests passing
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull Request Overview
This PR moves the TypedEncoder library from src/libs/ to src/lib/ and significantly enhances it with new encoding types and comprehensive test coverage. The main changes include:
- Added
EncodingTypeenum with 5 encoding modes (Struct, Array, ABI, CallWithSelector, CallWithSignature) - Added custom error types for better error handling
- Added support for polymorphic arrays and calldata encoding
- Updated all test files to use the new import path and add the required
encodingTypefield - Added new comprehensive test files covering nested structs, polymorphic arrays, calldata encoding, and error cases
Reviewed Changes
Copilot reviewed 8 out of 8 changed files in this pull request and generated 10 comments.
Show a summary per file
| File | Description |
|---|---|
| src/lib/TypedEncoder.sol | New location with enhanced functionality including encoding types, polymorphic array support, and calldata encoding capabilities |
| src/libs/TypedEncoder.sol | Old file removed (library relocated) |
| test/libs/TypedEncoderHash.t.sol | Updated import path and added encodingType field to all Struct initializations |
| test/libs/TypedEncoderEncode.t.sol | Updated import path and added encodingType field to all Struct initializations |
| test/libs/TypedEncoderNested.t.sol | New comprehensive test file for nested struct encoding scenarios |
| test/libs/TypedEncoderPolymorphic.t.sol | New test file for polymorphic array encoding |
| test/libs/TypedEncoderCalldata.t.sol | New test file for CallWithSelector and CallWithSignature encoding |
| test/libs/TypedEncoderErrors.t.sol | New test file for error handling validation |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Add new Hash encoding type that computes keccak256(abi.encodePacked(all_fields)) for compact hash commitments with expandable underlying data. Core implementation: - Added EncodingType.Hash enum value - Implemented _encodeHash() to compute keccak256 of packed struct data - Implemented _encodePackedChunk() for abi.encodePacked field packing - Implemented _encodePackedArray() for array packing without length prefix - Updated encode() to handle Hash type (returns 32 bytes) - Updated _isDynamic() to treat Hash as static (32-byte output) - Updated _encodeChunkFields() to handle nested Hash structs Key features: - Nested Hash structs create tree of hashes (hash first, then pack bytes32) - Arrays packed without length prefix for maximum compactness - No structural restrictions (any chunk/field configuration allowed) - Static when nested in parent structs (encoded inline, no offset) Test coverage: - 13 comprehensive tests covering primitives, nesting, arrays, edge cases - All 81 tests pass (13 new + 68 existing)
…dEncoder Add four new encoding types to extend TypedEncoder functionality: - Packed: Returns abi.encodePacked(all_fields) without hashing for custom byte encoding. Supports recursive packing of nested Packed structs. Returns dynamic bytes. - Create: Computes CREATE opcode addresses using RLP encoding. Implements comprehensive RLP encoding for nonces 0 to uint64 max (9 ranges). Formula: keccak256(rlp([deployer, nonce]))[12:]. Returns 20-byte address. - Create2: Computes CREATE2 deterministic addresses per EIP-1014. Formula: keccak256(0xff ++ deployer ++ salt ++ initCodeHash)[12:]. Returns 20-byte address. - Create3: Computes bytecode-independent addresses using two-stage pattern. Stage 1: CREATE2 intermediary, Stage 2: CREATE with nonce=1. Based on Axelar implementation. Returns 20-byte address. Core implementation: - Added 4 EncodingType enum values - Added 3 custom validation errors - Implemented 4 core encoding functions with full validation - Updated encode(), _encodePackedChunk(), _encodeChunkFields(), _isDynamic() - Packed treated as dynamic, Create/Create2/Create3 as static Test coverage: - 39 new tests (15 Packed + 24 Create*) - All 120 tests passing (81 existing + 39 new) - Comprehensive coverage of primitives, nesting, arrays, errors, edge cases
b1f82be to
d422ca8
Compare
- enforce chunk structure for create/call/array encodings before delegating - document recursion constraints and external struct usage via harnesses - temporarily skip revert expectation tests until revert assertions can run
|
closed in favor of #52 |
TypedEncoder - Complete Library Addition
This PR adds the TypedEncoder library - a comprehensive runtime struct encoding system supporting 10 encoding types for EIP-712 hashing, ABI encoding,
function calls, and contract address computation.
All 10 Encoding Types (All New in This PR)
Standard ABI Encoding
Function Call Encoding
Hash Encoding
Contract Address Computation
Quick Reference Table